# mdic["epoch"].append(epoch)
# mdic["batch_id"].append(batch_id)
# mdic["loss"].append(loss)
# mdic["acc"].append(acc)
# 请写一个方法画出训练过程中loss和acc的变化曲线并保存为svg文件 保存在 绘制的图像数据 文件夹

import pandas as pd
import matplotlib.pyplot as plt

from 模型.图像分类模型.ResNet50 import CNN_GRU

print(plt.style.available)
import os
from torchviz import make_dot


def plot_loss(excel_file, save_dir="绘制的图像数据"):
    """
    绘制并美化训练过程中各个模型的loss变化曲线，并保存为SVG文件。

    参数:
    excel_file (str): Excel文件的路径，包含多个模型的训练数据。,
    epoch	batch_id	loss	acc
      0	      0	        1.604083538	0.4375
      0	      1	        1.597064137	0.3125
      0	      2	        1.594406962	0.3125
      0	      3	        1.570549965	0.375
      0	      4	        1.59340024	0.25
      有多个sheet,sheet的name就是模型名
    save_dir (str): SVG文件保存的文件夹路径。
    """
    # 确保保存目录存在
    if not os.path.exists(save_dir):
        os.makedirs(save_dir, )

        # 读取Excel文件中的所有sheet名（模型名）
    xls = pd.ExcelFile(excel_file)
    model_names = xls.sheet_names

    for model_name in model_names:
        # 读取当前模型的数据
        df = pd.read_excel(excel_file, sheet_name=model_name)
        # 使用滑动平均平滑数据
        window_size = 5  # 可以根据需要调整窗口大小
        smoothed_loss = df['loss'].rolling(window=window_size).mean()
        # 在同一张图上绘制每个模型的准确率曲线
        plt.plot( smoothed_loss, label=f'Loss of {model_name}')

        # 图形美化
    plt.title('Loss Curves of All Models', fontsize=18)
    plt.xlabel('Step', fontsize=16)
    plt.ylabel('Loss', fontsize=16)
    plt.legend(fontsize=14)  # 调整图例字体大小
    plt.grid(True)
    plt.tight_layout()

    # 保存为SVG文件
    save_path = os.path.join(save_dir, 'all_models_loss.svg')
    plt.savefig(save_path, format='svg')
    plt.close()
    print(f"Saved loss plot for all models to {save_path}")


def plot_acc(excel_file, save_dir="绘制的图像数据"):
    """
    绘制并美化训练过程中各个模型的acc变化曲线，并保存为SVG文件。

    参数:
    excel_file (str): Excel文件的路径，包含多个模型的训练数据。,
    epoch	batch_id	loss	acc
      0	      0	        1.604083538	0.4375
      0	      1	        1.597064137	0.3125
      0	      2	        1.594406962	0.3125
      0	      3	        1.570549965	0.375
      0	      4	        1.59340024	0.25
      有多个sheet,sheet的name就是模型名
    save_dir (str): SVG文件保存的文件夹路径。
    """
    # 确保保存目录存在
    if not os.path.exists(save_dir):
        os.makedirs(save_dir, )

        # 读取Excel文件中的所有sheet名（模型名）
    xls = pd.ExcelFile(excel_file)
    model_names = xls.sheet_names

    for model_name in model_names:
        # 读取当前模型的数据
        df = pd.read_excel(excel_file, sheet_name=model_name)

        # 使用滑动平均平滑数据
        window_size = 5  # 可以根据需要调整窗口大小
        smoothed_acc = df['acc'].rolling(window=window_size).mean()

        # 在同一张图上绘制每个模型的准确率曲线
        plt.plot(smoothed_acc, label=f'Accuracy of {model_name}')



        # 图形美化
    plt.title('Accuracy Curves of All Models', fontsize=18)
    plt.xlabel('Step', fontsize=16)
    plt.ylabel('Accuracy', fontsize=16)
    plt.legend(fontsize=14)  # 调整图例字体大小
    plt.grid(True)
    plt.tight_layout()



    # 保存为SVG文件
    save_path = os.path.join(save_dir, 'all_models_accuracy.svg')
    plt.savefig(save_path, format='svg')
    plt.close()
    print(f"Saved accuracy plot for all models to {save_path}")


# plot_loss("日志数据/日志数据.xlsx")
# 假设你的模型实例是model
plot_loss("日志数据/训练/训练日志数据.xlsx", "绘制的图像数据")
plot_acc("日志数据/训练/训练日志数据.xlsx", "绘制的图像数据")

